/*
 * SPDX-License-Identifier: Apache-2.0
 */

#include "multi_malloc.h"
#include "mem_alloc.h"

/*******************************************************************************
* @brief  var.
*******************************************************************************/
extern const multi_malloc_type mem_sram;	

/*******************************************************************************
* @brief  debug.
*******************************************************************************/
#define MALLOC_DBG_EN 0

#if MALLOC_DBG_EN > 0
#define malloc_dbg_print dbg_print
#define malloc_dbg_puts dbg_puts
#else
#define malloc_dbg_print(...)
#define malloc_dbg_puts(...)
#endif

/*******************************************************************************
* @brief  compile.
*******************************************************************************/
#ifdef __CC_ARM
/* avoid the heap and heap-using library functions supplied by arm */
#pragma import(__use_no_heap)
#endif

#define size_t uint32_t

/*******************************************************************************
* @brief  malloc.
*******************************************************************************/
void *malloc(size_t n)
{
	void *pmem = mem_sram.api->malloc (n);
	
	malloc_dbg_print("mem malloc 0x%08x, size:0x%08x, mem used 0x%08x \n", (int)pmem, n, mem_sram.info->used_now);
	
    return pmem;
}

/*******************************************************************************
* @brief  realloc.
*******************************************************************************/
void *realloc(void *rmem, size_t newsize)
{
	void *pmem=0;
	
    pmem = mem_sram.api->realloc(rmem,newsize);

	malloc_dbg_print("mem realloc form 0x%08x to 0x%08x, size:0x%08x, mem used 0x%08x \n", (int)rmem, (int)pmem, newsize, mem_sram.info->used_now);
	
	return pmem;
}

/*******************************************************************************
* @brief  calloc.
*******************************************************************************/
void *calloc(size_t nelem, size_t elsize)
{
	void *pmem=0;
	
    pmem = mem_sram.api->calloc(nelem, elsize);
	
	malloc_dbg_print("mem calloc 0x%08x, size:0x%08x, mem used 0x%08x \n", (int)pmem, nelem * elsize, mem_sram.info->used_now);
	
	return pmem;
}

/*******************************************************************************
* @brief  free.
*******************************************************************************/
void free(void *rmem)
{
    mem_sram.api->free(rmem);
	
	malloc_dbg_print("mem free 0x%08x, mem used 0x%08x \n", (int)rmem, mem_sram.info->used_now);
}

